
import { _decorator, Component, Node, systemEvent, SystemEventType, Touch, EventTouch, Vec2, Vec3 } from 'cc';
const { ccclass, property } = _decorator;

const h_m_fram=0.02;//移动频率

@ccclass('Movectrl')
export class Movectrl extends Component {
    // [1]
    // dummy = '';

    // [2]
    // @property
    // serializableDummy = 0;

    tempVec2: Vec2 = new Vec2(0, 0);
    tempVec3: Vec3 = new Vec3(0, 0, 0);
    TOUCH_RADIUS_LIMIT: number = 400;//限制区域

    hr: Vec2 = new Vec2(1, 0);//水平线
    vr: Vec2 = new Vec2(0,1);//纵向线

    @property(Node)
    hero:Node=null!;//开启严格检查模式后，加！表示将null类型强制识别为Node类型

    @property(Animation)
    heroAnim:Animation=null!;//hero Animation 人物动画


    @property(Node)
    camera:Node=null!;//相机节点

    _startPost=new Vec2();//最初触摸的点
    _touchPost=new Vec2();//触摸移动点
    _cameraDelta=new Vec3();//人物与相机的差

    //移动
    _isTouch=false;



    start(){

        //人物与相机的差
        Vec3.subtract(this._cameraDelta,this.camera.worldPosition,this.hero.worldPosition);
    }


    onEnable() {
        systemEvent.on(SystemEventType.TOUCH_START, this.touchStart, this);
        systemEvent.on(SystemEventType.TOUCH_MOVE, this.touchMove, this);
        systemEvent.on(SystemEventType.TOUCH_END, this.touchEnd, this);
    }
    onDisable() {
        systemEvent.off(SystemEventType.TOUCH_START, this.touchStart, this);
        systemEvent.off(SystemEventType.TOUCH_MOVE, this.touchMove, this);
        systemEvent.off(SystemEventType.TOUCH_END, this.touchEnd, this);

    }
    update(){

        if(!this._isTouch){//没有触摸，返回
            return
        }
        console.log("hero translate ");
        this.hero.translate(new Vec3(0,0,h_m_fram));
        
        //相机跟随
        this.camera.worldPosition=(new Vec3(this.hero.worldPosition.add(this._cameraDelta)));
    }



    touchEnd(touch: Touch, event: EventTouch) {
        this._isTouch=false;//触摸结束
        //播放动画
        // this.heroAnim.play('Yawn');//停止
        // this.heroAnim.stop();
    }

    touchStart(touch: Touch, event: EventTouch) {

        const touchPos = touch.getUILocation(this._startPost);//触摸的坐标点
        this.tempVec3.set(touchPos.x, touchPos.y, 0);
        const length = touchPos.length();//计算向量的长度（模）
        if (length > this.TOUCH_RADIUS_LIMIT) {//通过 限制长度 指定区域
            return
        }

        this.node.setWorldPosition(this.tempVec3);//节点赋值

        //播放动画
        // this.heroAnim.play('Running');//跑
    }

    touchMove(touch: Touch, event: EventTouch) {
        const touchPos = touch.getUILocation(this._touchPost);
        
        //移动点与初始触摸点的差
        Vec2.subtract(this.tempVec2,this._touchPost,this._startPost);
        const rd=this.tempVec2.angle(this.vr);//与垂直线的角度，返回的是弧度值

        // Math.sign函数返回一个数字的符号, 指示数字是正数，负数还是零。
        const ag=(rd*180/Math.PI)*Math.sign(-this.tempVec2.x);

        console.log(ag);

        this.hero.eulerAngles=new Vec3(this.hero.eulerAngles.x,ag,this.hero.eulerAngles.z);//向左右 旋转


        this.tempVec3.set(touchPos.x, touchPos.y, 0);
        const length = touchPos.length();//计算向量的长度（模）

        const angle = touchPos.angle(this.hr);//与水平线的角度，返回的是弧度值

        if (length > this.TOUCH_RADIUS_LIMIT) {

            const x = Math.cos(angle) * this.TOUCH_RADIUS_LIMIT;//移动位置的x值
            const y = Math.cos(angle) * this.TOUCH_RADIUS_LIMIT;
            this.tempVec3.set(x, y, 0);

        }

        this._isTouch=true;//判断是否触摸，以便于人物移动

        this.node.setWorldPosition(this.tempVec3);

    }

}
